package com.aspire.aimini.model.query;

import lombok.Data;
import lombok.EqualsAndHashCode;
import lombok.experimental.Accessors;

import java.time.LocalDateTime;
import java.util.List;

/**
 * 导出任务查询条件
 *
 * @author wangguiyou
 * @date 2024-12-19
 */
@Data
@EqualsAndHashCode(callSuper = true)
@Accessors(chain = true)
public class ExportTaskQuery extends BaseQuery {

    /**
     * 用户ID
     */
    private Long userId;

    /**
     * 用户ID列表
     */
    private List<Long> userIds;

    /**
     * 数据类型
     */
    private String dataType;

    /**
     * 数据类型列表
     */
    private List<String> dataTypes;

    /**
     * 导出格式
     */
    private String format;

    /**
     * 导出格式列表
     */
    private List<String> formats;

    /**
     * 任务状态
     */
    private String status;

    /**
     * 任务状态列表
     */
    private List<String> statuses;

    /**
     * 最小进度
     */
    private Integer minProgress;

    /**
     * 最大进度
     */
    private Integer maxProgress;

    /**
     * 最小文件大小（字节）
     */
    private Long minFileSize;

    /**
     * 最大文件大小（字节）
     */
    private Long maxFileSize;

    /**
     * 开始时间范围 - 开始
     */
    private LocalDateTime startTimeStart;

    /**
     * 开始时间范围 - 结束
     */
    private LocalDateTime startTimeEnd;

    /**
     * 完成时间范围 - 开始
     */
    private LocalDateTime endTimeStart;

    /**
     * 完成时间范围 - 结束
     */
    private LocalDateTime endTimeEnd;

    /**
     * 过期时间范围 - 开始
     */
    private LocalDateTime expireTimeStart;

    /**
     * 过期时间范围 - 结束
     */
    private LocalDateTime expireTimeEnd;

    /**
     * 创建时间范围 - 开始
     */
    private LocalDateTime createTimeStart;

    /**
     * 创建时间范围 - 结束
     */
    private LocalDateTime createTimeEnd;

    /**
     * 更新时间范围 - 开始
     */
    private LocalDateTime updateTimeStart;

    /**
     * 更新时间范围 - 结束
     */
    private LocalDateTime updateTimeEnd;

    /**
     * 最小优先级
     */
    private Integer minPriority;

    /**
     * 最大优先级
     */
    private Integer maxPriority;

    /**
     * 最小重试次数
     */
    private Integer minRetryCount;

    /**
     * 最大重试次数
     */
    private Integer maxRetryCount;

    /**
     * 最小处理记录数量
     */
    private Long minProcessedCount;

    /**
     * 最大处理记录数量
     */
    private Long maxProcessedCount;

    /**
     * 最小总记录数量
     */
    private Long minTotalCount;

    /**
     * 最大总记录数量
     */
    private Long maxTotalCount;

    /**
     * 错误信息（模糊查询）
     */
    private String errorMessage;

    /**
     * 文件路径（模糊查询）
     */
    private String filePath;

    /**
     * 下载URL（模糊查询）
     */
    private String downloadUrl;

    /**
     * 是否有文件路径
     */
    private Boolean hasFilePath;

    /**
     * 是否有下载URL
     */
    private Boolean hasDownloadUrl;

    /**
     * 是否有错误信息
     */
    private Boolean hasErrorMessage;

    /**
     * 是否已过期
     */
    private Boolean isExpired;

    /**
     * 是否可以下载
     */
    private Boolean canDownload;

    /**
     * 是否可以重试
     */
    private Boolean canRetry;

    /**
     * 是否可以取消
     */
    private Boolean canCancel;

    /**
     * 排除的任务ID列表
     */
    private List<String> excludeIds;

    /**
     * 包含的任务ID列表
     */
    private List<String> includeIds;

    /**
     * 是否只查询活跃任务（pending或processing状态）
     */
    private Boolean onlyActive;

    /**
     * 是否只查询已完成任务
     */
    private Boolean onlyCompleted;

    /**
     * 是否只查询失败任务
     */
    private Boolean onlyFailed;

    /**
     * 是否只查询已取消任务
     */
    private Boolean onlyCancelled;

    /**
     * 是否只查询高优先级任务（优先级>=8）
     */
    private Boolean onlyHighPriority;

    /**
     * 是否只查询低优先级任务（优先级<=3）
     */
    private Boolean onlyLowPriority;

    /**
     * 是否只查询大文件任务（文件大小>=100MB）
     */
    private Boolean onlyLargeFiles;

    /**
     * 是否只查询小文件任务（文件大小<=10MB）
     */
    private Boolean onlySmallFiles;

    /**
     * 是否只查询长时间运行任务（运行时间>=1小时）
     */
    private Boolean onlyLongRunning;

    /**
     * 是否只查询快速完成任务（运行时间<=5分钟）
     */
    private Boolean onlyQuickCompleted;

    /**
     * 是否只查询今日任务
     */
    private Boolean onlyToday;

    /**
     * 是否只查询本周任务
     */
    private Boolean onlyThisWeek;

    /**
     * 是否只查询本月任务
     */
    private Boolean onlyThisMonth;

    /**
     * 是否只查询需要重试的任务
     */
    private Boolean onlyRetryable;

    /**
     * 是否只查询即将过期的任务（24小时内过期）
     */
    private Boolean onlyExpiringSoon;

    /**
     * 是否只查询已过期的任务
     */
    private Boolean onlyExpired;

    /**
     * 最小持续时间（毫秒）
     */
    private Long minDuration;

    /**
     * 最大持续时间（毫秒）
     */
    private Long maxDuration;

    /**
     * 最小处理速度（记录/秒）
     */
    private Double minProcessingSpeed;

    /**
     * 最大处理速度（记录/秒）
     */
    private Double maxProcessingSpeed;

    /**
     * 检查是否有时间范围查询条件
     */
    public boolean hasTimeRangeCondition() {
        return createTimeStart != null || createTimeEnd != null ||
                updateTimeStart != null || updateTimeEnd != null ||
                startTimeStart != null || startTimeEnd != null ||
                endTimeStart != null || endTimeEnd != null ||
                expireTimeStart != null || expireTimeEnd != null;
    }

    /**
     * 检查是否有文件相关查询条件
     */
    public boolean hasFileCondition() {
        return minFileSize != null || maxFileSize != null ||
                hasFilePath != null || hasDownloadUrl != null ||
                filePath != null || downloadUrl != null ||
                onlyLargeFiles != null || onlySmallFiles != null;
    }

    /**
     * 检查是否有状态相关查询条件
     */
    public boolean hasStatusCondition() {
        return status != null || statuses != null ||
                onlyActive != null || onlyCompleted != null ||
                onlyFailed != null || onlyCancelled != null;
    }

    /**
     * 检查是否有进度相关查询条件
     */
    public boolean hasProgressCondition() {
        return minProgress != null || maxProgress != null ||
                minProcessedCount != null || maxProcessedCount != null ||
                minTotalCount != null || maxTotalCount != null;
    }

    /**
     * 检查是否有优先级相关查询条件
     */
    public boolean hasPriorityCondition() {
        return minPriority != null || maxPriority != null ||
                onlyHighPriority != null || onlyLowPriority != null;
    }

    /**
     * 检查是否有性能相关查询条件
     */
    public boolean hasPerformanceCondition() {
        return minDuration != null || maxDuration != null ||
                minProcessingSpeed != null || maxProcessingSpeed != null ||
                onlyLongRunning != null || onlyQuickCompleted != null;
    }

    /**
     * 检查是否有重试相关查询条件
     */
    public boolean hasRetryCondition() {
        return minRetryCount != null || maxRetryCount != null ||
                onlyRetryable != null || canRetry != null;
    }

    /**
     * 检查是否有过期相关查询条件
     */
    public boolean hasExpirationCondition() {
        return isExpired != null || onlyExpiringSoon != null ||
                onlyExpired != null || expireTimeStart != null ||
                expireTimeEnd != null;
    }

    /**
     * 获取默认排序字段
     */
    @Override
    public String getDefaultSortField() {
        return "createTime";
    }

    /**
     * 获取默认排序方向
     */
    @Override
    public String getDefaultSortDirection() {
        return "DESC";
    }

    /**
     * 获取允许的排序字段
     */
    @Override
    public List<String> getAllowedSortFields() {
        return List.of(
                "id", "userId", "dataType", "format", "status",
                "progress", "fileSize", "startTime", "endTime",
                "expireTime", "createTime", "updateTime", "priority",
                "retryCount", "processedCount", "totalCount");
    }
}